Hermes Agent 源码架构详解
基于 v0.12.0 (2026.4.30) 源码分析
一、顶层目录总览
hermes-agent/
├── hermes_cli/ # CLI 主入口(argparse 命令体系)
├── agent/ # AI Agent 核心引擎
├── gateway/ # 消息网关(平台适配层)
├── tui_gateway/ # TUI JSON-RPC 后端
├── acp_adapter/ # ACP 编辑器协议适配器
├── environments/ # RL 训练环境 / Benchmark
├── plugins/ # 插件体系(记忆/图像/平台)
├── skills/ # 内置 Skill 库
├── optional-skills/ # 可选 Skill(区块链/健康/研究等)
├── web/ # Web 前端(TypeScript React)
├── website/ # 官方文档站(Docusaurus)
├── scripts/ # 工具脚本
├── cron/ # Cron 调度
├── docs/ # 开发文档
├── docker/ # Docker 配置
└── packaging/ # 打包配置(Homebrew 等)
二、核心模块详解
2.1 hermes_cli/ — 命令行入口(约50个模块)
职责:用户交互的 CLI 顶层,argparse 命令树管理,所有用户输入的入口。
| 模块 | 职责 |
|---|---|
main.py |
CLI 总入口,命令分发调度 |
config.py |
读写 ~/.hermes/config.yaml,缓存机制 |
providers.py |
Provider 定义 + Overlay 合并层 |
models.py |
模型目录、验证助手、API tier |
auth.py |
多 Provider 认证(OAuth + API key) |
setup.py |
交互式配置向导 |
commands.py |
Slash 命令定义(COMMAND_REGISTRY) |
cli.py |
HermesCLI 主类,运行 AIAgent |
gateway.py |
Gateway 服务管理(systemd/launchd) |
skin_engine.py |
6种皮肤主题系统 |
banner.py |
启动横幅 + ASCII 艺术 |
profiles.py |
多配置文件(--profile) |
env_loader.py |
.env 文件加载,非 ASCII 清理 |
backup.py |
SQLite zip 备份/导入 |
voice.py |
录音 + TTS API |
kanban.py |
看板 CLI |
pty_bridge.py |
PTY↔WebSocket 桥接(xterm.js) |
completion.py |
Bash/Zsh/Fish 补全脚本生成 |
连接关系:main.py 是调度中心,按需导入 config.py(配置)、providers.py(模型)、auth.py(认证),最终通过 cli.py 的 HermesCLI 运行 AIAgent。
2.2 agent/ — AI Agent 核心引擎(28个模块)
职责:LLM 调用、上下文管理、工具分发、错误恢复。是整个系统最核心的业务逻辑层。
| 模块 | 大小 | 职责 |
|---|---|---|
run_agent.py |
— | AIAgent 主循环,API 请求 + 工具分发 |
curator.py |
25.9KB | 上下文策展(消息管理 + 压缩决策) |
prompt_builder.py |
31.6KB | 最大文件,构建完整 prompt(系统提示 + 工具 + 消息历史) |
context_compressor.py |
25.2KB | 上下文压缩实现(DAG + 摘要) |
error_classifier.py |
37.7KB | API 错误分类 + 恢复策略(最大文件) |
display.py |
38.7KB | CLI 展示(spinner / diff 渲染) |
gemini_native_adapter.py |
33.8KB | Gemini 原生 API 适配器 |
bedrock_adapter.py |
24.9KB | AWS Bedrock 适配器 |
usage_pricing.py |
22.1KB | 用量追踪 + 成本计算 |
models_dev.py |
20.8KB | 模型能力元数据中央数据源 |
memory_manager.py |
20.9KB | 记忆 Provider 管理(内置 + 外部插件) |
shell_hooks.py |
29.6KB | Shell 脚本钩子桥接 |
tool_guardrails.py |
16.8KB | 工具循环防护(防止无限循环) |
moonshot_schema.py |
9.6KB | Moonshot 工具 Schema 转换 |
image_routing.py |
8.5KB | 用户图片路由(原生附件 vs 转文本) |
context_engine.py |
7.8KB | 上下文引擎抽象基类(插件接口) |
image_gen_provider.py |
7.6KB | 图像生成 Provider ABC |
prompt_caching.py |
2.2KB | Anthropic Prompt Caching |
redact.py |
15.0KB | 日志脱敏(API key 等) |
title_generator.py |
5.7KB | 会话标题自动生成 |
架构要点:
run_agent.py是核心调度者context_engine.py定义抽象接口,context_compressor.py是默认实现(可插拔)- 多适配器模式:
bedrock_adapter.py、gemini_native_adapter.py等将 OpenAI 格式请求转换为各 Provider 格式 - Provider 模式:记忆管理(
memory_manager.py)、图像生成(image_gen_provider.py)均支持插件扩展
2.3 gateway/ — 消息网关(平台适配层)
职责:将 AIAgent 连接到各消息平台(微信/Telegram/Discord 等),是整个多渠道消息接入的中枢。
| 模块 | 职责 |
|---|---|
run.py |
Gateway 主入口,启动所有平台适配器 |
session.py |
会话上下文追踪、消息来源路由、动态 system prompt |
config.py |
平台配置(Platform 枚举、SessionResetPolicy) |
delivery.py |
Cron 任务输出路由(origin/local/wecom 等) |
platform_registry.py |
平台适配器注册中心(支持热插拔) |
stream_consumer.py |
Agent token 流实时推送 |
pairing.py |
DM 配对码授权(secrets.choice + TTL + 限速) |
hooks.py |
生命周期事件钩子(startup/session/agent/command) |
session_context.py |
ContextVar 替代 os.environ(asyncio 并发安全) |
平台适配器(platforms/):
- 国内:
feishu.py、wecom.py、dingtalk.py - 海外:
telegram.py、discord.py、slack.py、whatsapp.py、signal.py - 特殊:
qqbot/(QQ 机器人,含 crypto + onboard)、api_server.py(HTTP API)、webhook.py、homeassistant.py
2.4 tui_gateway/ — TUI JSON-RPC 后端
职责:为 iOS/Web 客户端提供 TUI 能力(JSON-RPC over stdio/WebSocket)。
| 文件 | 职责 |
|---|---|
entry.py |
主入口,信号处理(SIGTERM/SIGHUP),stdin JSON-RPC 循环 |
server.py(5987行) |
JSON-RPC 方法注册/分发,会话管理,线程池处理慢操作 |
ws.py |
WebSocket 传输层,复用 server.dispatch() |
transport.py |
I/O sink 抽象(Stdio/WebSocket/Tee),ContextVar 路由 |
event_publisher.py |
仪表板侧边栏事件镜像(反向 WebSocket) |
slash_worker.py |
子进程运行 Slash 命令(会话隔离) |
render.py |
渲染桥接(agent.rich_output ↔ TUI markdown) |
2.5 acp_adapter/ — ACP 编辑器协议适配器
职责:让 Hermes 作为 ACP Agent 运行在 Zed/VS Code 等编辑器里。
| 文件 | 职责 |
|---|---|
entry.py |
CLI 入口,加载 .env,启动 acp.run_agent() |
server.py |
ACP Agent 服务器,暴露 create_message() 等接口 |
session.py |
ACP Session ↔ AIAgent 实例映射,持久化到 SessionDB |
events.py |
AIAgent 事件 → ACP session_update 回调工厂 |
tools.py |
Hermes 工具名 → ACP ToolKind 映射 |
auth.py |
检测当前配置的 Provider(api_key + provider) |
permissions.py |
ACP 权限请求 → hermes approval 回调桥接 |
2.6 environments/ — RL 训练与 Benchmark
职责:Atropos RL 训练环境和各种任务评估基准。
| 文件 | 职责 |
|---|---|
agent_loop.py |
多轮 tool-calling RL 引擎,ThreadPoolExecutor 避免 asyncio 死锁 |
hermes_base_env.py |
Atropos RL 训练基类(Phase 1 OpenAI server / Phase 2 ManagedServer) |
web_research_env.py |
多跳 Web 研究环境(FRAMES 数据集) |
agentic_opd_env.py |
On-Policy Distillation 环境(OpenClaw-RL 论文实现) |
hermes_swe_env/ |
SWE-Bench 风格,使用 Modal 云端沙箱 |
tool_call_parsers/ |
各模型工具调用解析器(qwen/llama/deepseek/gemini/kimi 等) |
benchmarks/yc_bench/ |
YC-Bench 长期战略评估(CEO 模拟) |
benchmarks/terminalbench_2/ |
Terminal-Bench 2.0(89个任务,Docker/Modal 隔离) |
2.7 plugins/ — 插件体系
职责:可插拔的扩展系统,通过抽象基类接口连接核心。
| 插件 | 关键实现 |
|---|---|
| memory/ | 7种记忆 Provider:mem0(语义搜索)、honcho(dialectic/recall)、holographic、supermemory、retaindb、byterover |
| image_gen/ | 图像生成:openai(gpt-image-2)、xai、openai-codex |
| platforms/ | TeamsAdapter(Microsoft Teams webhook + AdaptiveCard)、IrcAdapter |
| spotify/ | Spotify 播放/设备/队列/搜索/播放列表控制 |
| kanban/ | 看板(前端 + systemd 服务) |
| hermes-achievements/ | 成就系统 |
| context_engine/ | 可插拔上下文压缩引擎 |
| observability/langfuse/ | LLM 可观测性(Langfuse 集成) |
连接方式:插件实现抽象基类(MemoryProvider/ImageGenProvider/BasePlatformAdapter),通过 ctx.register_*() 注册到核心。
三、模块间依赖关系
3.1 整体架构图
┌─────────────────────────────┐
│ 用户输入 │
│ (CLI / Gateway / ACP / TUI) │
└──────────────┬──────────────┘
│
┌───────────────────┼───────────────────┐
↓ ↓ ↓
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
│ hermes_cli/ │ │ gateway/ │ │ acp_adapter/ │
│ commands.py │ │ run.py │ │ server.py │
│ (slash cmds)│ │ (平台适配中枢) │ │ (编辑器协议) │
└──────┬───────┘ └──────┬───────┘ └──────┬───────┘
│ │ │
└────────┬────────┴────────┬────────┘
↓ ↓
┌──────────────────────────────┐
│ agent/run_agent.py │
│ AIAgent 主循环(核心引擎) │
└──────────────────────────────┘
│
┌───────────────────┼───────────────────┐
↓ ↓ ↓
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ prompt_builder │ │ curator.py │ │ memory_manager │
│ 构建完整prompt │ │ 上下文策展/压缩 │ │ 记忆provider管理 │
│ (最大文件31.6KB) │ │ │ │ │
└────────┬────────┘ └────────┬────────┘ └────────┬────────┘
│ │ │
│ ┌────────┴────────┐ │
│ ↓ ↓ │
│ ┌────────────────┐ ┌──────────────┐ │
│ │context_compressor│ │context_engine│ │
│ │ (默认压缩实现) │ │ (抽象基类接口) │ │
│ └────────────────┘ └──────────────┘ │
│ │
└──────────────┬──────────────────────┘
↓
┌───────────────────────────────┐
│ agent/run_agent.py │
│ API请求 → 工具分发 → 响应 │
└───────────────────────────────┘
│
┌──────────────┼──────────────┐
↓ ↓ ↓
┌────────────┐ ┌────────────┐ ┌────────────┐
│Bedrock适配器│ │Gemini适配器 │ │ models_dev │
│ │ │ │ │ (模型元数据) │
└────────────┘ └────────────┘ └────────────┘
3.2 六条主线脉络
脉络一:CLI 交互线
main.py → cli.py → run_agent.py → 返回终端
↑
commands.py(slash命令定义COMMAND_REGISTRY)
用户敲 hermes chat → main.py 解析 → cli.py 的 HermesCLI 运行 → run_agent.py 执行推理 → 结果回显终端。
脉络二:消息平台线
gateway/run.py(总调度)
├── session.py(会话上下文)
├── platform_registry.py(平台注册表)
├── delivery.py(输出路由)
└── platforms/{telegram,wechat,wecom,...}.py(各平台适配器)
一个进程里跑所有平台,收到消息 → 路由到对应 session → run_agent.py → 响应推回平台。
脉络三:上下文压缩线
curator.py(策展人)
├── should_compress() → 判断何时压缩
└── compress() → 调用 context_compressor
└── context_compressor.py(默认实现)
└── context_engine.py(抽象基类,可插拔)
消息越来越多 → curator 决定压缩 → context_compressor 构建 DAG 做摘要 → 结果写回消息历史。
脉络四:工具分发线
run_agent.py(收到LLM的tool_calls)
↓
display.py(预览工具调用)
↓
工具执行(terminal/read_file/...]
↓
tool_guardrails.py(循环检测)
↓
结果返回 run_agent.py → 继续下一轮
脉络五:Provider 适配线
models_dev.py(模型元数据中央)
↓
┌──────────────────────────────────────┐
│ bedrock_adapter.py → AWS Bedrock │
│ gemini_native_adapter.py → Google │
│ moonshot_schema.py → Moonshot │
│ (各自转换 OpenAI格式 ↔ 各家格式) │
└──────────────────────────────────────┘
↓
统一经过 error_classifier.py 做错误分类和重试策略
↓
nous_rate_guard.py(速率限制保护)
脉络六:插件扩展线
run_agent.py
↓
memory_manager.py ───→ plugins/memory/{mem0,holographic,honcho,...}.py
image_gen_provider.py ──→ plugins/image_gen/{openai,xai,...}.py
shell_hooks.py ──→ 用户自定义 shell 脚本钩子
(均通过抽象基类接口注册,可热插拔)
四、三大脉络交汇点
| 脉络 | 起点 | 终点 | 核心文件 |
|---|---|---|---|
| 用户交互 | main.py |
终端/平台 | cli.py / gateway/run.py |
| 推理执行 | run_agent.py |
LLM API | prompt_builder.py + 各 adapter |
| 上下文管理 | curator.py |
消息历史 | context_compressor.py + context_engine.py |
三个脉络在 run_agent.py 交汇——它接收用户输入,调用 curator 构建 prompt,发送给 LLM,拿到 tool_calls 后分发执行,结果再流回 curator。
五、源码文件统计
| 目录 | Python文件数 | 主要职责 |
|---|---|---|
hermes_cli/ |
~50 | CLI 命令入口 |
agent/ |
~28 | AI Agent 核心引擎 |
gateway/ |
~30 | 消息网关 |
tui_gateway/ |
7 | TUI JSON-RPC |
acp_adapter/ |
8 | ACP 编辑器协议 |
environments/ |
~15 | RL 训练环境 |
plugins/ |
50+ | 插件体系 |
skills/ |
100+ | 内置 Skill 库 |
optional-skills/ |
200+ | 可选 Skill |
注:以上数据为源码包级别的模块统计,不包含 venv 依赖包。